//1:boost库分割
// #include <boost/algorithm/string.hpp>
// #include <vector>
// #include <string>
// #include <iostream>

// int main() {
//     std::string str = "a,,b,,,c,,,";
//     std::vector<std::string> parts1, parts2;

//     // 默认模式（token_compress_on）：连续分隔符被压缩，无空元素
//     boost::split(parts1, str, boost::is_any_of(","), boost::token_compress_on); 
//     // 显式指定不压缩（token_compress_off）：保留空元素
//     boost::split(parts2, str, boost::is_any_of(","), boost::token_compress_off);

//     std::cout << "默认模式（压缩）：";
//     // while (!parts1.empty() && parts1.back().empty()) {
//     //     parts1.pop_back();
//     // }//末尾空删除
//     for (const auto& p : parts1) 
//     {
//         if(p.size()==0) continue;
//         std::cout << "[" << p << "] "; // [a] [b] [c] 
//     }
//     std::cout << "\n不压缩模式：";
//     for (const auto& p : parts2) std::cout << "[" << p << "] "; // [a] [] [b] [] [] [c]
//     return 0;
// }
// //2:手动实现
// #include<iostream>
// #include<string>
// #include<vector>
// #include <cstdint>

// uint64_t Split(const std::string& src,const std::string&sep,std::vector<std::string>*arry)
//     {
//         int offset=0;
//         while(offset<src.size())
//         {
//         std::string res;
//         //abc,,,b,,,c,
//         size_t pos = src.find(sep, offset);//在src字符串偏移量offset处，开始向后查找sep字符/字串，返回查找到的位置
//         if(pos==std::string:: npos)
//         {
//             if(pos==offset) break;
//             arry->push_back(src.substr(offset));
//             return arry->size();
//         }
//         if(pos==offset)
//         {
//             offset=pos+sep.size();
//             continue;
//         }
//         arry->push_back(src.substr(offset,pos-offset));
//         offset=pos+sep.size();
//         }
//         return arry->size();
//     }
// int main()
// {
//     std::vector<std::string> p;
//     std::string src="abc,,,a,,,c,";
//     std::string sep=",";
//     Split(src,sep,&p);
//     for(auto &ch:p)
//     {
//         std::cout<<ch<<std::endl;
//     }
//     return 0;
// }
//3读取文件测试
#include"../source/server.hpp"
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include <cstdint>
bool ReadFile(const std::string&filename,std::string*buf)
    {
        std::ifstream ifs(filename,std::ios::binary);
        if(!ifs.is_open())
        {
            ERR_LOG("Open file error");
            ifs.close();
            return false;
        }
        size_t fsize=0;
        ifs.seekg(0,ifs.end);
        fsize=ifs.tellg();
        buf->resize(fsize);
        ifs.seekg(0,ifs.beg);
        ifs.read(&(*buf)[0],fsize);
        if(ifs.good()==false)
        {
            ERR_LOG("Read error");
            ifs.close();
            return false;
        }
        ifs.close();
        return true;
    }
 bool WriteFile(const std::string &filename, const std::string &buf)
    {
        std::ofstream ofs(filename, std::ios::binary | std::ios::trunc);
        if (!ofs.is_open())
        {
            ERR_LOG("Open file error");
            ofs.close();
            return false;
        }
        ofs.write(buf.c_str(), buf.size());
        if (ofs.good() == false)
        {
            ERR_LOG("WRITE %s FILE FAILED!", filename.c_str());
            ofs.close();
            return false;
        }
        ofs.close();
        return true;
    }
    char HxToint(char c)
    {
        if(c>='0'&&c<='9') return c-'0';
        else if(c>='a'&&c<='z') return c-'a'+10;
        else if(c>='A'&&c<='Z') return c-'A'+10;
        return -1;
    }
    std::string Encode(const std::string url,bool is_encode_space)
    {
        std::string res;
        for(auto c:url)
        {
            if(c=='.'||c=='-'||c=='~'||c=='_'||isalnum(c))
            {
                res+=c;
                continue;
            }
            if(c==' '&&is_encode_space)
            {
                res+='+';
                continue;
            }
            char tmp[4] = {0};
            //snprintf 与 printf比较类似，都是格式化字符串，只不过一个是打印，一个是放到一块空间中
            snprintf(tmp, 4, "%%%02X", c);
            res += tmp;
        }
        return res;
    }
    std::string Decode(const std::string&url,bool is_decode_space)
    {
        std::string res;
        for(int i=0;i<url.size();)
        {
            if(url[i]=='+'&&is_decode_space)
            {
                res+=' ';
                i++;
            }
            else if(url[i]=='%'&& (i + 2) < url.size())
            {
                char v1=HxToint(url[i+1]);
                char v2=HxToint(url[i+2]);
                char v=v1*16+v2;
                res+=v;
                i+=3;
                continue;
            }
            else{
            res+=url[i++];
            }
        }
        return res;
    }
int main()
{
    // std::string filename="./regex.cpp";
    // std::string buf;
    // if(!ReadFile(filename,&buf))
    // {
    //     std::cout<<1<<std::endl;
    // }
    // std::cout<<buf<<std::endl;
    // std::string filename2="./ttttttt.c";
    // WriteFile(filename2,buf);

    std::string url="./++   sdaa/?s=cmz&w=lw";
    std::string res=Encode(url,true);
    std::string r=Decode(res,true);
    std::cout<<res<<std::endl;
    std::cout<<r<<std::endl;
    return 0;
}